// 手机号码校验规则
export function checkTelephone(rule, value, callback) {
  if (value === '') {
    callback(new Error('请输入手机号码'))
  } else if (value.length !== 11) {
    callback(new Error('手机号码长度有误'))
  } else {
    const reg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
    if (!reg.test(value)) {
      callback(new Error('请输入正确的手机号码'))
    } else {
      callback()
    }
  }
}

// 身份证号码校验规则
export function checkIdCardNumber(rule, value, callback) {
  if (value === '') {
    callback(new Error('请输入身份证号'))
  } else if (value.length !== 15 && value.length !== 18) {
    callback(new Error('身份证号长度有误'))
  } else {
    const reg18 = /^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
    const reg15 = /^[1-9]\d{5}\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$/
    if (reg18.test(value) || reg15.test(value)) {
      callback()
    } else {
      callback(new Error('请输入正确的身份证号'))
    }
  }
}

// 纯数字校验
export function checkPurityNumber(rule, value, callback) {
  if (value === '') {
    callback(new Error('请输入有效数字'))
  } else {
    const purityNumber = /^[0-9]*$/
    if (purityNumber.test(value)) {
      callback()
    } else {
      callback(new Error('请输入有效数字'))
    }
  }
}

// N位数字校验
export function checkLenNumber(len) {
  var length = len
  return function(rule, value, callback) {
    const lenNumber = new RegExp('^\\d{' + length + '}$')
    if (value === '') {
      callback(new Error('不能为空'))
    } else {
      if (lenNumber.test(value)) {
        callback()
      } else {
        callback(new Error('请输入' + length + '位有效数字'))
      }
    }
  }
}

// 固定电话
export function landlinePhone(rule, value, callback) {
  const reg = /^(0[0-9]{2,3}\-)([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$/
  if (value === '') {
    callback(new Error('不能为空'))
  } else {
    if (reg.test(value)) {
      callback()
    } else {
      callback(new Error('固定电话格式有误'))
    }
  }
}

// 非零开头的最多带两位小数的数字
export function notZeroHeadFloat(rule, value, callback) {
  const reg = /^([1-9][0-9]*)+(\.[0-9]{1,2})?$/
  if (value === '') {
    callback(new Error('不能为空'))
  } else {
    if (reg.test(value)) {
      callback()
    } else {
      callback(new Error('非零开头的最多带两位小数的数字'))
    }
  }
}

// 字符长度校验规则
// test: [
//   { required: true, message: '请输入测试', trigger: 'blur' },
//   { length: 7, message: '测试长度不正确', validator: validateLength, trigger: 'blur' }
// ]
export function validateLength(rule, value, callback) {
  if (value.length !== rule.length) {
    callback(new Error(rule.message))
  } else {
    callback()
  }
}

// 邮箱校验
export function checkEmail(rule, value, callback) {
  const emailReg = /^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})$/
  if (!value) {
    callback(new Error('邮箱不能为空'))
  } else if (!emailReg.test(value)) {
    callback(new Error('邮箱格式错误'))
  } else {
    callback()
  }
}

// 强口令密码校验
/* 规则：
 *长度8-20位
 *必须包含数字
 *必须包含字母
 *可以包含常用特殊字符
 *不能含有4位连续相同的字符(例如：1111, aaaa)
 *不能含有4位连续的字母(例如：Abcd, lmno)
 *不能含有4位连续的数字(例如：1234, 8901)
 *不能含有4位键盘横向方向连续的字母(例如：qwer)
 *不能含有4位键盘斜向方向连续的字符(例如：1qaz)
 */
export function checkPassword(rule, value, callback) {
  const regex = /(?=.*[0-9])(?=.*[a-zA-Z]).{8,20}/
  // 字母连续规则
  const strReg = /(a(?=b)|b(?=c)|c(?=d)|d(?=e)|e(?=f)|f(?=g)|g(?=h)|h(?=i)|i(?=j)|j(?=k)|k(?=l)|l(?=m)|m(?=n)|n(?=o)|o(?=p)|p(?=q)|q(?=r)|r(?=s)|s(?=t)|t(?=u)|u(?=v)|v(?=w)|w(?=x)|x(?=y)|y(?=z)|z(?=a)){3}[a-z]/i
  // 数字连续规则
  const numReg = /(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){3}\d/
  // 键盘字母横向连续规则
  const keyboardHorizontalReg = /(q(?=w)|w(?=e)|e(?=r)|r(?=t)|t(?=y)|y(?=u)|u(?=i)|i(?=o)|o(?=p)|p(?=q) |a(?=s)|s(?=d)|d(?=f)|f(?=g)|g(?=h)|h(?=j)|j(?=k)|k(?=l)|l(?=a) | z(?=x)|x(?=c)|c(?=v)|v(?=b)|b(?=n)|n(?=m)|m(?=z)){3}[a-z]/i
  // 多个相同字母、数字规则
  const sameReg = /(\w)\1{3}/i

  /**
   * 键盘斜线的4个字符是否在pwd里面
   */
  function isStrInSlope(pwd) {
    const keyboardSlopeArr = ['1qaz', '2wsx', '3edc', '4rfv', '5tgb', '6yhn', '7ujm', '8ik,', '9ol.', '0p;/', '=[;.', '-pl,', '0okm', '9ijn', '8uhb', '7ygv', '6tfc', '5rdx', '4esz']
    return keyboardSlopeArr.some(v => pwd.toLowerCase().indexOf(v) > -1)
  }

  if (regex.test(value)) {
    if (sameReg.test(value)) {
      callback(new Error('密码不能含有连续4位相同的数字或字母'))
    } else if (strReg.test(value)) {
      callback(new Error('密码不能含有4位连续的字母'))
    } else if (numReg.test(value)) {
      callback(new Error('密码不能含有4位连续的数字'))
    } else if (keyboardHorizontalReg.test(value)) {
      callback(new Error('密码不能含有4位键盘横向方向连续的字母'))
    } else if (isStrInSlope(value)) {
      callback(new Error('密码不能含有4位键盘斜向方向连续的字符'))
    }
    callback()
  }
  callback(new Error('您的密码复杂度太低（密码中必须包含字母、数字、特殊字符），请重新设置密码'))
}

// 校验url
export function checkUrl(rule, value, callback) {
  if (!value) {
    callback(new Error('不能为空'))
  } else {
    const req = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\*\+,;=.]+$/
    if (req.test(value)) {
      callback()
    } else {
      callback(new Error('请输入有效URL'))
    }
  }
}
